package com.hochschild.sgv.web.action;

import com.hochschild.sgv.domain.CatalogoDetalle;
import com.hochschild.sgv.domain.Solicitud;
import com.hochschild.sgv.domain.Usuario;
import com.hochschild.sgv.domain.Feriado;
import com.hochschild.sgv.domain.PersonalSap;
import com.hochschild.sgv.domain.Vacacion;
import com.hochschild.sgv.ldap.LdapSeguridad;
import com.hochschild.sgv.service.CatalogoManager;
import com.hochschild.sgv.service.EquipoManager;
import com.hochschild.sgv.service.FeriadoManager;
import com.hochschild.sgv.service.FiltrosManager;
import com.hochschild.sgv.service.SolicitudManager;
import com.hochschild.sgv.service.UsuarioManager;
import com.hochschild.sgv.service.VacacionesManager;
import com.hochschild.sgv.util.ConexionBD;
import com.hochschild.sgv.util.Constantes;
import java.net.InetAddress;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import org.apache.struts.actions.DispatchAction;
import org.springframework.beans.factory.annotation.Autowired;
 
public class LoginAction extends DispatchAction {
    //private SolicitudDao solicitudDao;
    
    private LdapSeguridad ldapSeguridad = new LdapSeguridad();//LDAP
    @Autowired
    private SolicitudManager solicitudManager;
    @Autowired
    private EquipoManager equipoManager;
    @Autowired
    private UsuarioManager usuarioManager;
    @Autowired
    private VacacionesManager vacacionesManager;
    @Autowired
    private FeriadoManager feriadoManager;
    @Autowired
    private CatalogoManager catalogoManager;
//    Alex
    @Autowired
    private FiltrosManager filtrosManager;
    
    
//    Fin Alex

    public CatalogoManager getCatalogoManager() {
        return catalogoManager;
    }

    public void setCatalogoManager(CatalogoManager catalogoManager) {
        this.catalogoManager = catalogoManager;
    }

    public FeriadoManager getFeriadoManager() {
        return feriadoManager;
    }

    public void setFeriadoManager(FeriadoManager feriadoManager) {
        this.feriadoManager = feriadoManager;
    }

    public VacacionesManager getVacacionesManager() {
        return vacacionesManager;
    }

    public void setVacacionesManager(VacacionesManager vacacionesManager) {
        this.vacacionesManager = vacacionesManager;
    }

    public EquipoManager getEquipoManager() {
        return equipoManager;
    }

    public void setEquipoManager(EquipoManager equipoManager) {
        this.equipoManager = equipoManager;
    }

    public UsuarioManager getUsuarioManager() {
        return usuarioManager;
    }

    public void setUsuarioManager(UsuarioManager usuarioManager) {
        this.usuarioManager = usuarioManager;
    }

    public SolicitudManager getSolicitudManager() {
        return solicitudManager;
    }

    public void setSolicitudManager(SolicitudManager solicitudManager) {
        this.solicitudManager = solicitudManager;
    }

    public ActionForward init(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
  
        return mapping.findForward("init");
    }

    public ActionForward logout(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

        HttpSession session = request.getSession();
        session.removeAttribute("session_usuario");
        session.invalidate();

        return mapping.findForward("logout");
    }

    public ActionForward login(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response) throws Exception {
    
        LoginActionForm loginForm = (LoginActionForm) form;
        HttpSession session = request.getSession();
        String username = loginForm.getStrLogin();
        String password = loginForm.getStrClave();

        int resultado = -1;
        String mensaje = "";

        Usuario usuario = new Usuario();
     
//        Alex cometo el codigo de abajo
        //resultado = ldapSeguridad.autenticaUsuario(username, password) ? 1 : 2;
 
        // --- Comentar si se desea validar contraseña
        //resultado = 1;
        // ----
        
        //Alex
        ResourceBundle bundleApli = ResourceBundle.getBundle("aplicacion");
        if(request.getParameter("aprobar")!=null){
            resultado=4;
  
             String aprobar= request.getParameter("aprobar");
             
             if (aprobar.length()>8) {
                  String fecha=aprobar.substring(0, 8) ;
                  aprobar = aprobar.substring(8, aprobar.length());
           
                  SimpleDateFormat sdf= new SimpleDateFormat("dd-MM-yyyy"); 

                  fecha = fecha.substring(0, 2) + "-" + fecha.substring(2, 4) +  "-" + fecha.substring(4, 8); 
                  System.out.println("fecha " + fecha);
                  Date hoy = new Date();
                
                 try {
                   java.util.Date  d_url=sdf.parse(fecha);
                   Long diferenciasDias = numeroDias(hoy,d_url);
                   
                   
   
                    String cantDias = bundleApli.getString("aplicacion.cantDia").trim();
                    System.out.println("Cantidad de Dias  " + cantDias);
                    System.out.println("Diferencia de Dias  " + diferenciasDias);
                    System.out.println("new fecha " + d_url.toString());
              
                                          
                     if (diferenciasDias<=Long.parseLong(cantDias)) {
                        System.out.println("aprobar: " + aprobar);
                        session.setAttribute("aprobar", aprobar);
                   
                        Solicitud solicitud=new Solicitud();
                        int idpuesto =0;
                        solicitud.setIdSolicitud(Integer.parseInt(aprobar));
             
                        idpuesto = solicitudManager.getEstadoSolicitud(solicitud);
                        System.out.println("id Puesto  " + idpuesto);
                                 if (idpuesto!=0) {
                                    usuario.setIdPuesto(String.valueOf(idpuesto));
                                    Usuario usuarioJefe=new Usuario();
                                    usuarioJefe=usuarioManager.getUsuarioPorIdPuesto(usuario);

                                    if (usuarioJefe!=null) {
                                        System.out.println("Nombre Jefe  " + usuarioJefe.getNombreUsuario());
                                        username=usuarioJefe.getIdUsuario();
                                        resultado=1;
                                    }      
                                 }
                     }
                     System.out.println("LLEGO");
                          if (diferenciasDias>Long.parseLong(cantDias)) {
                             System.out.println("Pasaron los dias");
                             resultado=4;
                         }
                    
 
                     } catch (Exception e) {
                         System.out.println("Catch Error");
                          resultado=4;
                     }
 
             }else{
                 System.out.println("Error en el parametro");
                 resultado=4;
             }
  
        }else{
            resultado = ldapSeguridad.autenticaUsuario(username, password) ? 1 : 2;
        }
        
//        Fin Alex
        System.out.println("Resultado del ldap : " + resultado);
        switch (resultado) {
            case 1:
                usuario.setIdUsuario(username);
                //Obtiene la data del Usuaio SQL
                usuario = usuarioManager.getUsuarioById(usuario); 

                if (usuario != null) {
                     System.out.println("IdPuesto: " + usuario.getIdPuestoJefeInmediato());
                    if (usuario.getDivisionUsuario() != null && usuario.getIdGrupoPersonal() != null && usuario.getIdAreaPersonal() != null) {
                        List<CatalogoDetalle> listDivisiones = catalogoManager.getDetalleCatalogo(Constantes.CONFIGURACION_DIVISION);
                        List<CatalogoDetalle> listGrupoPersonal = catalogoManager.getDetalleCatalogo(Constantes.CONFIGURACION_GRUPO_PERSONAL);
                        List<CatalogoDetalle> listAreaPersonal = catalogoManager.getDetalleCatalogo(Constantes.CONFIGURACION_AREA_PERSONAL);
                            System.out.println("usuario.getDivisionUsuario: " + usuario.getDivisionUsuario());
                            int menuPlanificacion = permitirPlanificacion(usuario.getDivisionUsuario());
                        if (esDivisionRegistrada(usuario.getDivisionUsuario(), listDivisiones) && esGPRegistrada(usuario.getIdGrupoPersonal(), listGrupoPersonal) && esAPRegistrada(usuario.getIdAreaPersonal(), listAreaPersonal)) {
                            String servidorFotos = bundleApli.getString("aplicacion.servidorFotos").trim();
                            //Si tiene mas de 1 Subordinado es Jefe SQL
                            if (esJefe(usuario)) {
                                System.out.println("Es usuario jefe ");                    
                                session.setAttribute("esJefe", true);
                                    //Obtienes una Lista de Subordinados SAP
//                                List<PersonalSap> lstPersonalSaps = equipoManager.consultarEquipo(username.toUpperCase());
//                                request.setAttribute("lstPersonalSaps", lstPersonalSaps);
//                                    //Obtienes Lista de Solicitudes a aprobar SQL
//                                List<Solicitud> lstSolicitudesAprobadas = solicitudManager.getListaPorAprobadorEstado(usuario.getIdPuesto(), Constantes.SOLICITUD_POR_APROBAR);
//                                if (lstSolicitudesAprobadas.isEmpty()) {
//                                    System.out.println("No hay solicitudes por aprobar asociadas");
//                                } else {
//                                    System.out.println("Hay solicitudes por aprobar asociadas");
//                                }
//
//                                request.setAttribute("lstSolicitudesAprobadas", lstSolicitudesAprobadas);


                            } else {
                                session.setAttribute("esJefe", false);
                                System.out.println("Es colaborador");
                            }
                            
//                            Usuario usuarioJefe = new Usuario();
//                            usuarioJefe.setIdPuesto(usuario.getIdPuestoJefeInmediato());
//                                //Obtiene la data del Jefe del usario Ingresado SQL
//                            Usuario usuario_Jefe = usuarioManager.getUsuarioPorIdPuesto(usuarioJefe);
//                            if (usuario_Jefe != null) {
//                                request.setAttribute("usuario_jefe", usuario_Jefe);
//                            }
                            
//                                //Obtiene Lista de Vacaciones SAP
//                            List<Vacacion> lstVacaciones = vacacionesManager.consultarVacaciones(usuario.getIdUsuario());
//                            if (lstVacaciones.size() > 0) {
//                                String periodo = "";
//                                    //    Se acumula el Saldo
//                                int saldoAcumulado = 0;
//                                for (Vacacion v : lstVacaciones) {
//                                    if (!periodo.equals(v.getPeriodo())) {
//                                        saldoAcumulado += v.getSaldo();
//                                        periodo = v.getPeriodo();
//                                    }
//                                }
//
//                                request.setAttribute("saldoAcumulado", saldoAcumulado);
//                            }
//                            request.setAttribute("lstVacaciones", lstVacaciones);
                            
                            
                            
//                            try {
//                                java.util.Date today = new java.util.Date();
//                                java.sql.Date sqlToday = new java.sql.Date(today.getTime());
//
//                                    //Obtiene Lista de Solicitudes SQL
//                                List<Solicitud> lstSolicitudes = solicitudManager.getListaPorUsuarioEstado(usuario.getIdUsuario(), Constantes.SOLICITUD_APROBADA, Constantes.SOLICITUD_POR_APROBAR, sqlToday);
//                                request.setAttribute("lstSolicitudes", lstSolicitudes);
//
//                                    //Obtiene Lista de Feriados SAP
//                                List<Feriado> lstFeriados = feriadoManager.obtieneFeriados(usuario.getDivisionUsuario(), formateaFechaSAP(getPrimerDiaDelAnio()), formateaFechaSAP(getUltimoDiaDelAnio()));
//                                request.setAttribute("lstFeriados", lstFeriados);
//
//                            } catch (Exception e) {
//                                System.out.println(e.toString());
//                            }
                            String esAdmin= filtrosManager.verificarAdmin(usuario.getIdUsuario());
                             usuario.setEsAdmin(esAdmin);
                                System.out.println("esAdmin: " + esAdmin);
                            session.setAttribute("servidorFotos", servidorFotos);
                            session.setAttribute("session_usuario", usuario);
                            session.setMaxInactiveInterval(-1);
                            request.setAttribute("menuPlanificacion", menuPlanificacion);
                            return mapping.findForward("satisfactorio");
                        } else {
                            System.out.println("No Tiene Permiso de Acceso");
                            mensaje = "Ud. no tiene acceso al sistema";
                            break;
                        }

                    } else {
                        mensaje = "Ud. no tiene acceso al sistema";
                        break;
                    }
                } else {
                    mensaje = "No se encontró usuario en la base de datos.";
                    break;
                }

            case 2:
                mensaje = "Verifique usuario y password.";
                break;
            case 0:
                mensaje = "Falló la conexion con LDAP, contacte a mesa de ayuda.";
                break;
            case 3:
                mensaje = "No se encontró su email en el LDAP, contacte a mesa de ayuda.";
                break;
            case 4:
                mensaje = "La solicitud ya fue procesada";
                break;
            default:
                mensaje = "Error en el vector de  servidores LDAP.";
                break;

        }
       
        if (!mensaje.equals("")) {
            request.setAttribute("strMsj", mensaje);
            return mapping.findForward("error");
        }
        return null;
    }

    private boolean esJefe(Usuario usuario) {
        return usuarioManager.getCantidad(usuario) >= 1;
    }

    public LdapSeguridad getLdapSeguridad() {
        return ldapSeguridad;
    }

    public void setLdapSeguridad(LdapSeguridad ldapSeguridad) {
        this.ldapSeguridad = ldapSeguridad;
    }

    private String formateaFechaSAP(Date fecha) {
        DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
        String fechaSap = dateFormat.format(fecha);
        return fechaSap;
    }

    private boolean esDivisionRegistrada(String idDivisionUsuario, List<CatalogoDetalle> detalleCatalogo) {
        boolean resultado = false;
        for (CatalogoDetalle dc : detalleCatalogo) {
            if (dc.getDescripcion().equals(idDivisionUsuario)) {
                resultado = true;
                break;
            }

        }
        return resultado;
    }

    private boolean esGPRegistrada(String idGrupoPersonal, List<CatalogoDetalle> detalleCatalogo) {
        boolean resultado = false;
        for (CatalogoDetalle dc : detalleCatalogo) {
            if (dc.getDescripcion().equals(idGrupoPersonal)) {
                resultado = true;
                break;
            }

        }
        return resultado;
    }

    private boolean esAPRegistrada(String idAreaPersonal, List<CatalogoDetalle> detalleCatalogo) {
        boolean resultado = false;
        for (CatalogoDetalle dc : detalleCatalogo) {
            if (dc.getDescripcion().equals(idAreaPersonal)) {
                resultado = true;
                break;
            }

        }
        return resultado;
    }

    private static Date getPrimerDiaDelAnio() {

        Calendar cal = Calendar.getInstance();

        cal.set(cal.get(Calendar.YEAR),
                cal.getActualMinimum(Calendar.MONTH),
                cal.getActualMinimum(Calendar.DAY_OF_MONTH),
                cal.getMinimum(Calendar.HOUR_OF_DAY),
                cal.getMinimum(Calendar.MINUTE),
                cal.getMinimum(Calendar.SECOND));
        java.util.Date utilFecha = cal.getTime();
        java.sql.Date sqlFecha = new java.sql.Date(utilFecha.getTime());

        return sqlFecha;

    }

    private static Date getUltimoDiaDelAnio() {

        Calendar cal = Calendar.getInstance();

        cal.set(cal.get(Calendar.YEAR),
                cal.getActualMaximum(Calendar.MONTH),
                cal.getActualMaximum(Calendar.DAY_OF_MONTH),
                cal.getMaximum(Calendar.HOUR_OF_DAY),
                cal.getMaximum(Calendar.MINUTE),
                cal.getMaximum(Calendar.SECOND));
        java.util.Date utilFecha = cal.getTime();
        java.sql.Date sqlFecha = new java.sql.Date(utilFecha.getTime());

        return sqlFecha;

    }
    
//    Alex
    
      public ActionForward web(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

          System.out.println("webbbbb");

        return null;
    }
      
       public static long numeroDias(Date fecha1,Date fecha2){

            try{
                    final long MS_IN_A_DAY = 1000*60*60*24;

                    java.util.Date date1 = getUtilDate(fecha1);
                    java.util.Date date2 = getUtilDate(fecha2);

                    long diff = date1.getTime() - date2.getTime();

                    long numDays = diff/MS_IN_A_DAY;

                    return numDays;

            }
            catch(Exception e){
                                    return 0;
                            }
	}
       
       public static java.util.Date getUtilDate(java.util.Date dsql){
           
            java.util.Date dutil= new java.util.Date(dsql.getTime());
            return dutil;
    }
//    Fin Alex
       
       private int permitirPlanificacion(String sudDivision){
        int permitir=0;
        try {
            ResultSet rst = null;
            rst = new ConexionBD().ExecuteSelect(this.consultarMenuPlanificacion(sudDivision), "Demonio");
            if (rst.next()) {
                permitir = 1;
            }
 
        } catch (SQLException ex) {
            Logger.getLogger(LoginAction.class.getName()).log(Level.SEVERE, null, ex);
        }
              System.out.println("Permitir MenuPlanificacion: " + permitir);
            return permitir;      
       }
       
       private String consultarMenuPlanificacion(String subDivision){
           StringBuilder SQL= new StringBuilder();
           SQL.append("SELECT [idCatalogo], [idItem], [descripcion]"); 
           SQL.append(" FROM [dbo].[CatalogoDetalle]");
           SQL.append(" WHERE [idCatalogo]='");
           SQL.append(7);
           SQL.append("' AND [descripcion]='");
           SQL.append(subDivision);
           SQL.append("'");
           return SQL.toString();
       }
}
